import java.util.Random;
import java.util.HashSet;
import java.util.Set;

public class CalculationSystemV03 {
    public static void main(String[] args) {
        // 创建Random对象用于生成随机数
        Random random = new Random();
        
        // 使用HashSet存储已生成的算式，用于检测重复
        Set<String> generatedExpressions = new HashSet<>();
        
        // 程序标题
        System.out.println("加减法口算练习系统-v0.3\n");
        System.out.println("50道100以内的加减法口算练习题（无重复算式）：\n");
        
        // 用于跟踪当前是第几题
        int count = 1;
        
        // 确保至少有一定数量的加法和减法
        int additionCount = 0;
        int subtractionCount = 0;
        int totalRequired = 50;
        int minOfEachType = 15; // 每种类型至少生成15题
        
        // 生成50道无重复的练习题
        while (count <= totalRequired) {
            // 每行显示3个算式
            for (int j = 0; j < 3 && count <= totalRequired; j++) {
                String expression = null;
                String key = null;
                int num1 = 0, num2 = 0, result = 0;
                
                // 确保生成足够数量的加法和减法
                boolean needAddition = additionCount < minOfEachType;
                boolean needSubtraction = subtractionCount < minOfEachType;
                
                int operation;
                // 如果还需要生成特定类型的题目，则强制生成
                if (needAddition && !needSubtraction) {
                    operation = 0; // 强制生成加法
                } else if (needSubtraction && !needAddition) {
                    operation = 1; // 强制生成减法
                } else {
                    // 否则随机选择
                    operation = random.nextInt(2);
                }
                
                // 生成不重复的算式
                boolean isDuplicate;
                do {
                    isDuplicate = false;
                    
                    if (operation == 0) {
                        // 加法：确保和不超过100
                        num1 = random.nextInt(99) + 1;
                        num2 = random.nextInt(100 - num1) + 1;
                        result = num1 + num2;
                        
                        // 为了防止交换律导致的重复（如 2+3 和 3+2 视为相同算式），我们标准化存储方式
                        if (num1 > num2) {
                            int temp = num1;
                            num1 = num2;
                            num2 = temp;
                        }
                        key = "add:" + num1 + ":" + num2; // 标准化的键
                        expression = count + ". " + num1 + " + " + num2 + " = " + result;
                    } else {
                        // 减法：确保差不小于0
                        num1 = random.nextInt(100) + 1;
                        num2 = random.nextInt(num1) + 1;
                        result = num1 - num2;
                        
                        // 减法不交换，因为 a-b 和 b-a 是不同的算式
                        key = "sub:" + num1 + ":" + num2;
                        expression = count + ". " + num1 + " - " + num2 + " = " + result;
                    }
                    
                    // 检查是否重复
                    if (generatedExpressions.contains(key)) {
                        isDuplicate = true;
                    }
                } while (isDuplicate); // 如果重复，继续生成
                
                // 将新生成的算式添加到集合中
                generatedExpressions.add(key);
                
                // 更新计数
                if (operation == 0) {
                    additionCount++;
                } else {
                    subtractionCount++;
                }
                
                // 格式化输出
                System.out.printf("%-25s", expression);
                count++;
            }
            // 每行结束后换行
            System.out.println();
        }
        
        // 关于实现的说明
        System.out.println("\n实现说明：");
        System.out.println("1. 使用HashSet存储已生成的算式，确保没有重复");
        System.out.println("2. 对于加法，考虑了交换律（如 2+3 和 3+2 视为相同算式）");
        System.out.println("3. 确保习题中同时包含加法和减法算式，各至少15题");
        System.out.println("4. 总题数：" + totalRequired + "题，其中加法：" + additionCount + "题，减法：" + subtractionCount + "题");
        System.out.println("5. 加法和不超过100，减法差不小于0");
    }
}